<?php

namespace app\common\service\shop;

use Exception;
use think\admin\extend\HttpExtend;
use think\exception\ValidateException;

/**
 * OzonService
 * @Description Ozon接口服务
 * @docs https://docs.ozon.ru/api/seller/zh/?abt_att=1#tag/Introduction
 * @author shirukun
 * @date 2024-10-23
 */
class Ozon
{
    // api接口地址
    protected $api_url = "https://api-seller.ozon.ru";

    // 配置
    protected $config = [
        'client_id' => '',
        'api_key' => '',
    ];

    /**
     * 错误信息
     */
    public $err;

    /**
     * 获取错误信息
     * @return array
     */
    public function getErr()
    {
        return $this->err;
    }

    /**
     * @throws Exception
     */
    public function __construct($config = [])
    {
        $this->config = array_merge($this->config, $config);
        try {
            validate([
                'client_id' => 'require',
                'api_key' => 'require',
            ], [
                'client_id.require' => 'ozon配置用户识别号不存在',
                'api_key.require' => 'ozon配置api-秘钥不存在',
            ])->check($this->config);
        } catch (ValidateException $e) {
            // 验证失败 输出错误信息
//            Log::record($e->getMessage(), 'export');
            throw new Exception($e->getMessage());
        }
    }

    /**
     * Desc: 拉取订单
     * @docs https://docs.ozon.ru/api/seller/zh/?abt_att=1#operation/PostingAPI_GetFbsPostingListV3
     * @param $where
     * @return array
     */
    public function getOrderList($where = [], $limit = 200, $offset = 1, $dir = 'asc')
    {
        $params = [
            'dir' => $dir,
            'filter' => [
            //    'since' => '2024-02-01T00:00:00.000Z',// UTC模式
            //    'status' => 'delivering', // 货件运输状态
            //    'to' => '2024-12-01T23:59:59.000Z',// UTC模式
            //    'delivery_method_id' =>  [1,2],// 快递方式ID
            //    //从合作伙伴仓库（FBP）发货时的货件筛选器：ALL — 响应中将显示所有符合其他筛选器条件的货件
            //    //ONLY — 仅显示FBP货件 WITHOUT — 显示除FBP外的所有货件 FBP方案仅适用于中国卖家
            //    'fbpFilter'  => 'ALL',
            //    'order_id'   => 1,// 订单ID
            //    'provider_id'    => [1,2],//快递服务ID
            //    //货件运输状态 awaiting_registration — 等待注册，acceptance_in_progress — 正在验收，awaiting_approve — 等待确认，
            //    //awaiting_packaging — 等待包装，awaiting_deliver — 等待装运，arbitration — 仲裁，client_arbitration — 快递客户仲裁，
            //    //delivering — 运输中,driver_pickup — 司机处，delivered — 已送达，cancelled — 已取消，not_accepted — 分拣中心未接受，sent_by_seller – 由卖家发送。
            //    'status' => 'delivering',
            //    'warehouse_id'   => [1,2],//仓库ID。
            //    'last_changed_status_date' => [ //货件最后一次更改过状态的时期。
            //       'from' => '2024-02-01T00:00:00.000Z',//时期开始日期
            //       'to' => '2024-12-01T23:59:59.000Z',//时期结束日期
            //    ],
            ],
            'limit' => $limit,
            'offset' => $offset,
            'with' => [
                'analytics_data' => true,
                'barcodes' => true,
                'financial_data' => true,
                'product_exemplars' => true,
                'translit' => true,
            ],
        ];

        $params['filter']['since'] = date('c', strtotime(date('Y/m/d 00:00:00')));
        $params['filter']['to'] = date('c', strtotime(date('Y/m/d 23:59:59')));
        $params['filter']['since'] = substr($params['filter']['since'], 0, -6) . '.000Z';
        $params['filter']['to'] = substr($params['filter']['to'], 0, -6) . '.000Z';

        $params['filter'] = array_merge( $params['filter'], $where);
        //Log::record($params,'test');
//        halt($params);

        $res = HttpExtend::post($this->api_url . '/v3/posting/fbs/list', json_encode($params, '320'), ['headers' => ['Content-Type:application/json', 'Client-Id:' . $this->config['client_id'], 'Api-Key:' . $this->config['api_key']]]);
        $res = json_decode($res, true);
            //Log::record($orderData,'test');
//        halt($orderData);

        if(empty($res)){
            $this->err = '网络错误';
            return ['code' => 0, 'data' => []];
        }

        if(isset($res['code'])){
            $this->err = $res['message'];
            return ['code' => 0, 'data' => []];
        }

        return ['code' => 1, 'data' => $res['result']];
    }

    /**
     * Desc: 获取订单详情
     * @docs 按照ID获取货件信息
     * @docs https://docs.ozon.ru/api/seller/zh/?abt_att=1#operation/PostingAPI_GetFbsPostingV3
     * @param $posting_number Ozon 订单id
     * @return array
     */
    public function getOrderInfo($posting_number)
    {
        $params = [
            "posting_number" => $posting_number,
            "with" => [ // 需要添加到响应中的附加字段。
                "analytics_data" => true, // 将分析数据添加到响应中
                "barcodes" => true, // 将货件条形码添加到响应中
                "financial_data" => true, // 将财务数据添加到响应中。
                "related_postings" => true, // 将相关货件数量添加到响应中。 相关货件是在组装期间将母快递拆分的快递。
                "product_exemplars" => true,
                "translit" => true, //完成返回值的拼写。
            ]
        ];

//        halt($params);

        $res = HttpExtend::post($this->api_url . '/v3/posting/fbs/get', json_encode($params, '320'), ['headers' => ['Content-Type:application/json', 'Client-Id:' . $this->config['client_id'], 'Api-Key:' . $this->config['api_key']]]);
        //halt($res);
        $res = json_decode($res, true);
            //Log::record($orderData,'test');

        if(empty($res)){
            $this->err = '网络错误';
            return ['code' => 0, 'data' => []];
        }

        if(isset($res['code'])){
            $this->err = $res['message'];
            return ['code' => 0, 'data' => []];
        }

        return ['code' => 1, 'data' => $res['result']];
    }

    /**
     * Desc: 同步商品
     * @docs https://docs.ozon.ru/api/seller/zh/?abt_att=1#operation/ProductAPI_ImportProductsV3
     * @param $where
     * @return array
     */
    public function synProduct($item = [])
    {
//         $params = [
//             "items" => [
//                 [
//                     "attributes" => [ // 商品特性组。 不同类别的特征不同 — 其可见 卖家知识库 或通过 API。todo
//                         [
//                             "complex_id" => 0,
//                             "id" => 5076,
//                             "values" => [
//                                 [
//                                   "dictionary_value_id" => 971082156,
//                                    "value" => "麦克风架",
//                                 ]
//                             ]
//                         ],
//                         [
//                             "complex_id" => 0,
//                              "id" => 9048,
//                              "values" => [
//                                   [
//                                       "value" => "一套X3NFC保护膜。 深色棉质",
//                                   ],
//                              ]
//                         ],
//                     ],
//                    "barcode" => "test-00000001", // 商品条码
//                    "description_category_id" => 17027899, // ---可选 类别ID。 请将其与以下方法结合使用：/v1/description-category/attribute и /v1/description-category/attribute/values。 todo
// //                   "new_description_category_id" => 17027899, // ---可选 新的类目标识符。如果需要更改当前商品类目，请填写该标识符。 todo
// //                   "color_image" => "", // ---可选 营销色彩。 格式：公共云存储中图像链接的URL。 链接的图像格式为JPG
// //                   "complex_attributes" => [], // ---可选 商品特性组。不同类别的特征不同 — 可见 卖家知识库 或通过 API。
//                    "currency_code" => "CNY", // ---可选 价格显示的货币。 传输值必须与个人中心设置中所设置的货币相匹配。 默认情况下，显示RUB — 俄罗斯卢布。RUB — 俄罗斯卢布,BYN — 白俄罗斯卢布,KZT — 坚戈,EUR — 欧元,USD — 美元,CNY — 元。
//                    "depth" => 10, // 包装厚度。
//                    "dimension_unit" => "mm", // ---可选 尺寸测量单位: mm — 毫米,cm — 厘米,in — 英寸
//                    "height" => 250, // 包装高度。
//                    "images" => [], // 图像组。 最多15件。 图像以与组中相同的顺序显示在网站上。如果不传递值 primary_image, 组中的第一个图像将是商品的主图。如果您传递了值 primary_image，则最多传递14个图像。 如果 primary_image 参数为空，则最多传递15个图像。格式：公共云存储中图像链接的URL。 链接的图像格式为JPG或PNG。
// //                   "primary_image" => "", // ---可选 链接到商品主图。
// //                   "images360" => [], // ---可选 图像组360。至70件。格式：公共云存储中图像链接的URL。 链接的图像格式为JPG。
//                    "name" => "API开发测试商品", // 商品名称。 至500字符
//                    "offer_id" => "test-00000001", // 卖方系统中的商品ID — 货号。至50字符。
//                    "old_price" => "100", // ---可选 折扣前的价格（将在产品卡上划掉）。 以卢布表示。分数分隔 符号 — 点, 在点之后最多两个字符。如果您之前传递了 old_price, 那么在更新 price 时也请更新 old_price。
// //                   "pdf_list" => [], // ---可选 PDF-文件清单。
//                    "price" => "89.8", // 商品价格，包括折扣，显示在商品卡上。 如果商品没有折扣，请指定 此参数中 old_price 的值。
//                     "type_id" => "87458888", // ---可选 商品类型的标识符。 可以通过方法/v1/description-category/tree的响应参数 type_id 获取对应的值。 填写此参数时，可以不在 attibutes 中指定参数 id:8229 的属性，type_id 将优先使用。
//                    "vat" => "0", // 商品增值税税率:0 — 免除增值税,0.1 — 10%,0.2 — 20%。
//                    "weight" => 100, // 含包装的商品重量。 限值为1000公斤或其他换算值 计量单位。
//                    "weight_unit" => "g", // 测重单位：g — 克,kg — 公斤,lb — 磅。
//                    "width" => 150, // 包装宽度。
//                 ],
//                 [
//                     "attributes" => [ // 商品特性组。 不同类别的特征不同 — 其可见 卖家知识库 或通过 API。todo
//                         [
//                             "complex_id" => 0,
//                             "id" => 5076,
//                             "values" => [
//                                 [
//                                   "dictionary_value_id" => 971082156,
//                                    "value" => "麦克风架",
//                                 ]
//                             ]
//                         ],
//                         [
//                             "complex_id" => 0,
//                              "id" => 9048,
//                              "values" => [
//                                   [
//                                       "value" => "一套X3NFC保护膜。 深色棉质",
//                                   ],
//                              ]
//                         ],
//                     ],
//                    "barcode" => "test-00000001", // 商品条码
//                    "description_category_id" => 17027899, // ---可选 类别ID。 请将其与以下方法结合使用：/v1/description-category/attribute и /v1/description-category/attribute/values。 todo
// //                   "new_description_category_id" => 17027899, // ---可选 新的类目标识符。如果需要更改当前商品类目，请填写该标识符。 todo
// //                   "color_image" => "", // ---可选 营销色彩。 格式：公共云存储中图像链接的URL。 链接的图像格式为JPG
// //                   "complex_attributes" => [], // ---可选 商品特性组。不同类别的特征不同 — 可见 卖家知识库 或通过 API。
//                    "currency_code" => "CNY", // ---可选 价格显示的货币。 传输值必须与个人中心设置中所设置的货币相匹配。 默认情况下，显示RUB — 俄罗斯卢布。RUB — 俄罗斯卢布,BYN — 白俄罗斯卢布,KZT — 坚戈,EUR — 欧元,USD — 美元,CNY — 元。
//                    "depth" => 10, // 包装厚度。
//                    "dimension_unit" => "mm", // ---可选 尺寸测量单位: mm — 毫米,cm — 厘米,in — 英寸
//                    "height" => 250, // 包装高度。
//                    "images" => [], // 图像组。 最多15件。 图像以与组中相同的顺序显示在网站上。如果不传递值 primary_image, 组中的第一个图像将是商品的主图。如果您传递了值 primary_image，则最多传递14个图像。 如果 primary_image 参数为空，则最多传递15个图像。格式：公共云存储中图像链接的URL。 链接的图像格式为JPG或PNG。
// //                   "primary_image" => "", // ---可选 链接到商品主图。
// //                   "images360" => [], // ---可选 图像组360。至70件。格式：公共云存储中图像链接的URL。 链接的图像格式为JPG。
//                    "name" => "API开发测试商品", // 商品名称。 至500字符
//                    "offer_id" => "test-00000001", // 卖方系统中的商品ID — 货号。至50字符。
//                    "old_price" => "100", // ---可选 折扣前的价格（将在产品卡上划掉）。 以卢布表示。分数分隔 符号 — 点, 在点之后最多两个字符。如果您之前传递了 old_price, 那么在更新 price 时也请更新 old_price。
// //                   "pdf_list" => [], // ---可选 PDF-文件清单。
//                    "price" => "89.8", // 商品价格，包括折扣，显示在商品卡上。 如果商品没有折扣，请指定 此参数中 old_price 的值。
//                     "type_id" => "87458888", // ---可选 商品类型的标识符。 可以通过方法/v1/description-category/tree的响应参数 type_id 获取对应的值。 填写此参数时，可以不在 attibutes 中指定参数 id:8229 的属性，type_id 将优先使用。
//                    "vat" => "0", // 商品增值税税率:0 — 免除增值税,0.1 — 10%,0.2 — 20%。
//                    "weight" => 100, // 含包装的商品重量。 限值为1000公斤或其他换算值 计量单位。
//                    "weight_unit" => "g", // 测重单位：g — 克,kg — 公斤,lb — 磅。
//                    "width" => 150, // 包装宽度。
//                 ],
//             ],
//         ];

        $params = ['items' => $item];
        $params = json_encode($params,320);
        //Log::record($params,'test');

        $res = HttpExtend::post($this->api_url . '/v3/product/import', $params, ['headers' => ['Content-Type:application/json', 'Client-Id:' . $this->config['client_id'], 'Api-Key:' . $this->config['api_key']]]);
        $res = json_decode($res, true);
            //Log::record($orderData,'test');
        //halt($res);

        if(empty($res)){
            $this->err = '网络错误';
            return ['code' => 0, 'data' => []];
        }

        if(isset($res['code'])){
//            throw new Exception($orderData['message']);
            $this->err = $res['message'];
            return ['code' => 0, 'data' => []];
        }

        return ['code' => 1, 'data' => $res['result']];
    }

    /**
     * Desc: 商品类别和类型的树形图
     * @docs https://docs.ozon.ru/api/seller/zh/?abt_att=1#operation/DescriptionCategoryAPI_GetTree
     */
    public function GetCategoryTree($language = "ZH_HANS")
    {
        $param = [
            "language" => $language, // "DEFAULT" "RU" — 俄语 "EN" — 英语 "TR" — 土耳其语 "ZH_HANS" — 中文
        ];

        $res = HttpExtend::post($this->api_url . '/v1/description-category/tree', json_encode($param, '320'), ['headers' => ['Content-Type:application/json', 'Client-Id:' . $this->config['client_id'], 'Api-Key:' . $this->config['api_key']]]);
        $res = json_decode($res, true);
        //Log::record($orderData,'test');
//        halt($orderData);

        if(empty($res)){
            $this->err = '网络错误';
            return ['code' => 0, 'data' => []];
        }
        if(isset($res['code'])){
//            throw new Exception($orderData['message']);
            $this->err = $res['message'];
            return ['code' => 0, 'data' => []];
        }

        return ['code' => 1, 'data' => $res['result']];
    }

    /**
     * Desc: 获取商品特征列表
     * @docs https://docs.ozon.ru/api/seller/zh/?abt_att=1#operation/DescriptionCategoryAPI_GetAttributes
     */
    public function getBrandByPages($description_category_id, $type_id, $language = "ZH_HANS")
    {
        $param = [
            "language" => $language, // "DEFAULT" "RU" — 俄语 "EN" — 英语 "TR" — 土耳其语 "ZH_HANS" — 中文
            "description_category_id" => $description_category_id, // 类别ID。 (父级分类id)
            "type_id" => $type_id, // 商品类型ID。 (最小级分类id)
        ];
        $param = json_encode($param,320);

        $res = HttpExtend::post($this->api_url . '/v1/description-category/attribute', $param, ['headers' => ['Content-Type:application/json', 'Client-Id:' . $this->config['client_id'], 'Api-Key:' . $this->config['api_key']]]);
        $res = json_decode($res, true);
        //Log::record($orderData,'test');
//        halt($orderData);

        if(empty($res)){
            $this->err = '网络错误';
            return ['code' => 0, 'data' => []];
        }

        if(isset($res['code'])){
//            throw new Exception($orderData['message']);
            $this->err = $res['message'];
            return ['code' => 0, 'data' => []];
        }

        return ['code' => 1, 'data' => $res['result']];
    }

    /**
     * Desc: 获取商品特征值列表
     * @docs https://docs.ozon.ru/api/seller/zh/?abt_att=1#operation/DescriptionCategoryAPI_GetAttributeValues
     */
    public function getAttributeByPages($attribute_id, $description_category_id, $type_id, $limit = 200, $last_value_id = 0, $language = "ZH_HANS")
    {
        $param = [
            "attribute_id" => $attribute_id, // 特性ID。
            "description_category_id" => $description_category_id, // 类别ID。 (父级分类id)
            "language" => $language, // "DEFAULT" "RU" — 俄语 "EN" — 英语 "TR" — 土耳其语 "ZH_HANS" — 中文
            "last_value_id" => $last_value_id, // 启动响应的指南 ID。 如果last_value_id为 10，则响应将包含从第十一个开始的指南。
            "limit" => $limit,
            "type_id" => $type_id // 商品类型ID。 (最小级分类id)
        ];
        $param = json_encode($param,320);

        $res = HttpExtend::post($this->api_url . '/v1/description-category/attribute/values', $param, ['headers' => ['Content-Type:application/json', 'Client-Id:' . $this->config['client_id'], 'Api-Key:' . $this->config['api_key']]]);
        $res = json_decode($res, true);
        //Log::record($orderData,'test');
//        halt($orderData);

        if(empty($res)){
            $this->err = '网络错误';
            return ['code' => 0, 'data' => []];
        }

        if(isset($res['code'])){
//            throw new Exception($orderData['message']);
            $this->err = $res['message'];
            return ['code' => 0, 'data' => []];
        }

        return ['code' => 1, 'data' => $res];
    }

    /**
     * 根据请求中的指定值value返回属性的参考值
     * @param [type] $attribute_id
     * @param [type] $description_category_id
     * @param [type] $type_id
     * @param [type] $value
     * @param integer $limit
     * @Description
     * @author wangqinghui
     * @date 2024-12-10 17:14
     * @return void
     */
    public function searchAttributeValue($attribute_id, $description_category_id, $type_id, $value, $limit = 100)
    {
        $param = [
            "attribute_id" => $attribute_id, // 特性ID。
            "description_category_id" => $description_category_id, // 类别ID。 (父级分类id)
            "limit" => $limit,
            "type_id" => $type_id, // 商品类型ID。 (最小级分类id)
            'value' => $value
        ];
        $param = json_encode($param);

        $res = HttpExtend::post($this->api_url . '/v1/description-category/attribute/values/search', $param, ['headers' => ['Content-Type:application/json', 'Client-Id:' . $this->config['client_id'], 'Api-Key:' . $this->config['api_key']]]);
        $res = json_decode($res, true);

        if(empty($res)){
            $this->err = '网络错误';
            return ['code' => 0, 'data' => []];
        }

        if(isset($res['code'])){
            $this->err = $res['message'];
            return ['code' => 0, 'data' => []];
        }

        return ['code' => 1, 'data' => $res];
    }

    /**
     * Desc: 获取商品添加状态
     * @param $task_id
     * @docs https://docs.ozon.ru/api/seller/zh/?abt_att=1#operation/ProductAPI_GetImportProductsInfo
     */
    public function getGoodsImportMsg($task_id)
    {
        $param = [
            "task_id" => $task_id, // 商品的队列任务代码。（批次）
        ];
        $param = json_encode($param,320);
        $res = HttpExtend::post($this->api_url . '/v1/product/import/info', $param, ['headers' => ['Content-Type:application/json', 'Client-Id:' . $this->config['client_id'], 'Api-Key:' . $this->config['api_key']]]);
        $res = json_decode($res, true);
        //Log::record($orderData,'test');
//        halt($res);

        if(empty($res)){
            $this->err = '网络错误';
            return ['code' => 0, 'data' => []];
        }

        if(isset($res['code'])){
//            throw new Exception($orderData['message']);
            $this->err = $res['message'];
            return ['code' => 0, 'data' => []];
        }

        return ['code' => 1, 'data' => $res];
    }

    /**
     * Desc: 打印标签
     * @param $posting_number
     * @docs https://docs.ozon.ru/api/seller/zh/?abt_att=1#operation/PostingAPI_PostingFBSPackageLabel
     */
    public function getPackageLabel($posting_number = [])
    {
        $param = [
            "posting_number" => $posting_number, // 货运ID ["48173252-0034-4"]
        ];
        $param = json_encode($param,320);
        $res = HttpExtend::post($this->api_url . '/v2/posting/fbs/package-label', $param, ['headers' => ['Content-Type:application/json', 'Client-Id:' . $this->config['client_id'], 'Api-Key:' . $this->config['api_key']]]);
        $res = json_decode($res, true);
        //Log::record($orderData,'test');
//        halt($res);

        if(empty($res)){
            $this->err = '网络错误';
            return ['code' => 0, 'data' => []];
        }

        if(isset($res['code'])){
//            throw new Exception($orderData['message']);
            $this->err = $res['message'];
            return ['code' => 0, 'data' => []];
        }

        return ['code' => 1, 'data' => $res];
    }

    /**
     * Desc: 仓库清单
     * @docs https://docs.ozon.ru/api/seller/zh/?abt_att=1#operation/WarehouseAPI_WarehouseList
     */
    public function getWarehouseList()
    {
        $res = HttpExtend::post($this->api_url . '/v1/warehouse/list', [], ['headers' => ['Content-Type:application/json', 'Client-Id:' . $this->config['client_id'], 'Api-Key:' . $this->config['api_key']]]);
        $res = json_decode($res, true);
        //Log::record($orderData,'test');
//        halt($res);

        if(empty($res)){
            $this->err = '网络错误';
            return ['code' => 0, 'data' => []];
        }

        if(isset($res['code'])){
//            throw new Exception($orderData['message']);
            $this->err = $res['message'];
            return ['code' => 0, 'data' => []];
        }

        return ['code' => 1, 'data' => $res];
    }

    /**
     * Desc: 更新库存商品的数量
     * @param $where
     * @docs https://docs.ozon.ru/api/seller/zh/?abt_att=1#operation/ProductAPI_ProductsStocksV2
     */
    public function setProductStock($where = [])
    {
        // $param = [
        //     "offer_id" => '', // 卖家系统中的商品编号是 — 商品代码。
        //     "product_id" => '', // 商品编号。
        //     "stock" => '', // 扣除预留库存后的可售商品数量。
        //     "warehouse_id" => '', // 仓库编号。
        // ];

        // $param = array_merge($param, $where);
        $param = ['stocks' => $where];

        $param = json_encode($param,320);
        $res = HttpExtend::post($this->api_url . '/v2/products/stocks', $param, ['headers' => ['Content-Type:application/json', 'Client-Id:' . $this->config['client_id'], 'Api-Key:' . $this->config['api_key']]]);
        $res = json_decode($res, true);
        //Log::record($orderData,'test');
//        halt($res);

        if(empty($res)){
            $this->err = '网络错误';
            return ['code' => 0, 'data' => []];
        }

        if(isset($res['code'])){
//            throw new Exception($orderData['message']);
            $this->err = $res['message'];
            return ['code' => 0, 'data' => []];
        }

        return ['code' => 1, 'data' => $res];
    }

    /**
     * Desc: 库存余额的信息
     * @param $where array
     * @docs https://docs.ozon.ru/api/seller/zh/?abt_att=2#operation/ProductAPI_ProductStocksByWarehouseFbs
     */
    public function getStocksInfo($sku = [])
    {
        $param = [
            "sku" => $sku, // 商品SKU ["8888888"]。
        ];

        $param = json_encode($param,320);
        $res = HttpExtend::post($this->api_url . '/v1/product/info/stocks-by-warehouse/fbs', $param, ['headers' => ['Content-Type:application/json', 'Client-Id:' . $this->config['client_id'], 'Api-Key:' . $this->config['api_key']]]);
        $res = json_decode($res, true);
        //Log::record($orderData,'test');
//        halt($res);

        if(empty($res)){
            $this->err = '网络错误';
            return ['code' => 0, 'data' => []];
        }

        if(isset($res['code'])){
//            throw new Exception($orderData['message']);
            $this->err = $res['message'];
            return ['code' => 0, 'data' => []];
        }

        return ['code' => 1, 'data' => $res];
    }

    /**
     * Desc: 商品数量的信息
     * @param $where array
     * @docs https://docs.ozon.ru/api/seller/zh/#operation/ProductAPI_GetProductInfoStocks
     */
    public function getProductStockList($cursor, $offer_ids, $product_ids = [], $limit = 100, $visibility = 'ALL')
    {
        $param = [
            'cursor'    =>  $cursor,
            'filter'    =>  [
                'offer_id' =>  $offer_ids,
                'product_id' =>  $product_ids,
                'visibility'    =>  $visibility,
            ],
            'limit'     =>  $limit
        ];

        $param = json_encode($param,320);
        $res = HttpExtend::post($this->api_url . '/v4/product/info/stocks', $param, ['headers' => ['Content-Type:application/json', 'Client-Id:' . $this->config['client_id'], 'Api-Key:' . $this->config['api_key']]]);
        $res = json_decode($res, true);

        if(empty($res)){
            $this->err = '网络错误';
            return ['code' => 0, 'data' => []];
        }

        if(isset($res['code'])){
            $this->err = $res['message'];
            return ['code' => 0, 'data' => []];
        }

        return ['code' => 1, 'data' => $res];
    }

    /**
     * Desc: 商品的信息
     * @param $where array
     * @docs https://docs.ozon.ru/api/seller/zh/#operation/ProductAPI_GetProductInfoV2
     */
    public function getProductInfo(string $offer_id, int $product_id = 0, int $sku = 0)
    {
        $param = [
            'offer_id'  =>  $offer_id,
            'product_id'    =>  $product_id,
            'sku'       =>  $sku,
        ];

        $param = json_encode($param,320);
        $res = HttpExtend::post($this->api_url . '/v2/product/info', $param, ['headers' => ['Content-Type:application/json', 'Client-Id:' . $this->config['client_id'], 'Api-Key:' . $this->config['api_key']]]);
        $res = json_decode($res, true);

        if(empty($res)){
            $this->err = '网络错误';
            return ['code' => 0, 'data' => []];
        }

        if(isset($res['code'])){
            $this->err = $res['message'];
            return ['code' => 0, 'data' => []];
        }

        return ['code' => 1, 'data' => $res];
    }

     /**
     * Desc: 商品列表
     * @param $where array
     * @docs https://docs.ozon.ru/api/seller/zh/#operation/ProductAPI_GetProductList
     */
    public function getProductList(array $offer_ids = [],string $last_id = '', array $product_ids = [], int $limit = 200, string $visibility = 'ALL')
    {
        $param = [
            'filter'    =>  [
                'offer_id'  =>  $offer_ids,
                'product_id'    =>  $product_ids,
                'visibility'    =>  $visibility,
            ],
            'last_id'   =>  $last_id,
            'limit'     =>  $limit
        ];

        $param = json_encode($param,320);
        $res = HttpExtend::post($this->api_url . '/v2/product/list', $param, ['headers' => ['Content-Type:application/json', 'Client-Id:' . $this->config['client_id'], 'Api-Key:' . $this->config['api_key']]]);
        $res = json_decode($res, true);

        if(empty($res)){
            $this->err = '网络错误';
            return ['code' => 0, 'data' => []];
        }

        if(isset($res['code'])){
            $this->err = $res['message'];
            return ['code' => 0, 'data' => []];
        }

        return ['code' => 1, 'data' => $res];
    }
}